package com.pan.behavioral.Interpreter;

/**
 * 解释器模式
 *
 *(1) 易于改变和扩展文法。由于在解释器模式中使用类来表示语言的文法规则，因此可以通过
 * 继承等机制来改变或扩展文法。
 * (2) 每一条文法规则都可以表示为一个类，因此可以方便地实现一个简单的语言。
 * (3) 实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的，这些类
 * 的代码编写都不会特别复杂，还可以通过一些工具自动生成节点类代码。
 * (4) 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新
 * 的终结符表达式或非终结符表达式类，原有表达式类代码无须修改，符合“开闭原则”。
 * 1. 主要缺点
 * 解释器模式的主要缺点如下：
 * (1) 对于复杂文法难以维护。在解释器模式中，每一条规则至少需要定义一个类，因此如果一
 * 个语言包含太多文法规则，类的个数将会急剧增加，导致系统难以管理和维护，此时可以考
 * 虑使用语法分析程序等方式来取代解释器模式。
 * (2) 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用，因此在解释较为复杂
 * 的句子时其速度很慢，而且代码的调试过程也比较麻烦。
 */
public class InterpreterApplication {
    public static void main(String[] args) {
        MyInterpreter myInterpreter = new MyInterpreter();
        String code =  "" +
                ""+
                "10 + 10 +1 print" +
                "" +
                "";
        myInterpreter.handles(code);





        //        Integer result;
//        result = (Integer) myInterpreter.handle("1 + 2");
//        System.out.println(result);
//        result = (Integer) myInterpreter.handle("1 +2+3+4+ 5+6 -1021");
//        System.out.println(result);
//        result = (Integer) myInterpreter.handle("1 + 2 - 3 + 4 - 1149");
//        System.out.println(result);
//        myInterpreter.handle("1 + 1 + 2 + 1141 + 191980000 print");
//        myInterpreter.handle("'Hello World!' print");
//        myInterpreter.handle("'你好！' print");
//        myInterpreter.handles("" +
//                "a=190;" +
//                "b=115;" +
//                "a + 70 - b print;");
//        myInterpreter.handles(
//                "a='hello world';" +
//                "a print;"
//        );
    }
}
